函数原型:
function Server->taskwait(mixed $data, float $timeout = 0.5, int $dstWorkerId = -1) : string | bool
taskwait
与task
方法作用相同,用于投递一个异步的任务到task
进程池去执行。与task
不同的是taskwait
是同步等待的,直到任务完成或者超时返回。
$result
为任务执行的结果,由$serv->finish
函数发出。如果此任务超时,这里会返回false
。
- 第
1
个参数为投递的任务数据,可以是任意类型,非字符串类型底层会自动进行串化 - 第
2
个参数为超时时间,浮点型,单位为秒,最小支持1ms
粒度,超过规定时间内Task
进程未返回数据,taskwait
将返回false
,不再处理后续的任务结果数据 - 第
3
个参数可以指定要给投递给哪个Task
进程,传入ID
即可,范围是0 - serv->task_worker_num
$dstWorkerId
在1.6.11
以上版本可用,可以指定目标Task
进程的ID
,默认为-1表示随机投递,底层会自动选择一个空闲Task
进程
4.0.4
以下版本中taskwait
是阻塞接口,如果你的Server
是全异步的请使用swoole_server::task
和swoole_server::finish
,不要使用taskwait
4.0.4
以上版本中taskwait
底层会进行协程调度,实现完全的异步IO
taskwait
方法不能在task
进程中调用
从4.0.4
版本开始taskwait
方法将支持协程调度,在协程中调用Server->taskwait()
时将自动进行协程调度,不再阻塞等待。
借助协程调度器,taskwait
可以实现并发调用。
在同步阻塞模式下,taskwait
需要使用管道通信和共享内存,将数据返回给Worker
进程,这个过程是同步阻塞的。
如果onTask
中没有任何阻塞IO操作,底层仅有2次进程切换的开销,并不会产生IO等待,因此这种情况下 taskwait
可以视为非阻塞。实际测试onTask
中仅读写PHP数组,进行10万次taskwait
操作,总耗时仅为1秒
,平均每次消耗为10微秒